﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.CompilerServices;
using System.Collections.Generic;
using AccesoDatos.DAO.Base;
using AccesoDatos.DTO;
using AccesoDatos.DTO.Base;


namespace AccesoDatos.DAO
{

    /// <summary>
    /// Descripcion breve de AlumnoAsignaturaDAO
    /// </summary>
    public class AlumnoAsignaturaDAO : BaseDAO,IDAO
    {

        #region Singleton

        private static AlumnoAsignaturaDAO instance;

        private AlumnoAsignaturaDAO()
        {
            //Vacio
        }

        /// <summary>
        /// Devuelve una instancia de AlumnoAsignaturaDAO
        /// </summary>
        /// <returns>instancia de AlumnoAsignaturaDAODTO</returns>
        [MethodImpl(MethodImplOptions.Synchronized)]
        public static AlumnoAsignaturaDAO GetInstance()
        {
            if (instance == null)
            {
                instance = new AlumnoAsignaturaDAO();
            }

            return instance;
        }

        #endregion

        #region Metodos privados

        /// <summary>
        /// Funcion que rellena el bean con los valores obtenidos en DataReader
        /// </summary>
        /// <param name="dr">DataReader que contiene todos los valores directos de la base de datos</param>
        /// <returns>DTO Relleno con los valores obtenidos</returns>
        private AlumnoAsignaturaDTO RellenaBean(SqlDataReader dr)
        {
            AlumnoAsignaturaDTO bean = new AlumnoAsignaturaDTO();

            bean.CoAsignatura = this.GetNullableIntFromDataReader(dr, "CO_ASIGNATURA");
            bean.CoAlumno = this.GetNullableIntFromDataReader(dr, "CO_ALUMNO");
            bean.Nombre = this.GetStringFromDataReader(dr, "NOMBRE");
            bean.Apellido1 = this.GetStringFromDataReader(dr, "APELLIDO1");
            bean.Apellido2 = this.GetStringFromDataReader(dr, "APELLIDO2");
            bean.DNI = this.GetStringFromDataReader(dr, "DNI");
            bean.NombreAsignatura = this.GetStringFromDataReader(dr, "NOMBREASIGNATURA");
            bean.CreditosAsig = this.GetNullableIntFromDataReader(dr, "CREDITOSASIG");

            return bean;
        }
        
        #endregion

        #region Miembros de IDAO

        /// <summary>
        /// Metodo que inserta un registro en la base de datos
        /// </summary>
        /// <param name="dto">Objeto de IDTO que contiene todos los parametros</param>
        public void Insert(IDTO dto)
        {
            AlumnoAsignaturaDTO filtro = new AlumnoAsignaturaDTO();
            filtro = (AlumnoAsignaturaDTO)dto;
            try
            {
                string sql = "spu_AlumnoAsignaturaDAO_Insert";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoAsignatura", GetSqlValue(filtro.CoAsignatura));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                //Aqui estaria muy bien meter linq;
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que elimina un regitro de la base de datos
        /// </summary>
        /// <param name="dto">Objeto de IDTO que contiene todos los parametros</param>
        public void Delete(IDTO dto)
        {
            AlumnoAsignaturaDTO filtro = new AlumnoAsignaturaDTO();
            filtro = (AlumnoAsignaturaDTO)dto;
            try
            {
                string sql = "spu_AlumnoAsignaturaDAO_Delete";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoAsignatura", GetSqlValue(filtro.CoAsignatura));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));

                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex)
            {
                throw new DAOException(GetErrorSqlPersonalizado(ex));
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        /// <summary>
        /// Metodo que actualiza un registro de la base de datos
        /// </summary>
        /// <param name="filtro">Objeto DTO que contiene los datos para actualizar el registro</param>
        public void Update(IDTO dto)
        {
            //AlumnoAsignaturaDTO filtro = new AlumnoAsignaturaDTO();
            //filtro = (AlumnoAsignaturaDTO)dto;
            //try
            //{
            //    string sql = "spu_AlumnoAsignaturaDTO_Update";
            //    SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
            //    cmd.CommandType = CommandType.StoredProcedure;
            //    cmd.Parameters.AddWithValue("@CoAsignatura", GetSqlValue(filtro.CoAsignatura));
            //    cmd.Parameters.AddWithValue("@CoProfesor", GetSqlValue(filtro.CoProfesor));
            //    cmd.Parameters.AddWithValue("@Nombre", GetSqlValue(filtro.Nombre));
            //    cmd.Parameters.AddWithValue("@CreditosAsig", GetSqlValue(filtro.CreditosAsig));
            //    cmd.Parameters.AddWithValue("@CoTitulacion", GetSqlValue(filtro.CoTitulacion));

            //    cmd.ExecuteNonQuery();
            //}
            //catch (SqlException ex)
            //{
            //    throw new DAOException(GetErrorSqlPersonalizado(ex));
            //}
            //catch (Exception ex)
            //{
            //    throw new DAOException(ex);
            //}

            throw new Exception("El metodo update no esta hecho!!");
        }

        /// <summary>
        /// Funcion que devuelve una lista de objetos IDTO filtrados por todos los valores propios de la asignatura
        /// </summary>
        /// <param name="filtro">Parametros de busqueda con los filtros(valores nulos)</param>
        /// <returns>Lista con todos los resultados de la busqueda</returns>
        public List<IDTO> Get(IDTO dto)
        {
            AlumnoAsignaturaDTO filtro = new AlumnoAsignaturaDTO();
            filtro = (AlumnoAsignaturaDTO)dto;
            try
            {
                List<IDTO> lista = new List<IDTO>();
                string sql = "spu_AlumnoAsignaturaDAO_GetAlumnosAsignatura";
                SqlCommand cmd = new SqlCommand(sql, this.ConexionIntegra);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@CoAsignatura", GetSqlValue(filtro.CoAsignatura));
                cmd.Parameters.AddWithValue("@CoAlumno", GetSqlValue(filtro.CoAlumno));
                cmd.Parameters.AddWithValue("@Nombre", GetSqlValue(filtro.Nombre));
                cmd.Parameters.AddWithValue("@Apellido1", GetSqlValue(filtro.Apellido1));
                cmd.Parameters.AddWithValue("@Apellido2", GetSqlValue(filtro.Apellido2));
                cmd.Parameters.AddWithValue("@DNI", GetSqlValue(filtro.DNI));
                cmd.Parameters.AddWithValue("@ListadoGeneral", GetSqlValue(filtro.ListadoGeneral));
                using(SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read()) 
                    {
                        AlumnoAsignaturaDTO asignatura = new AlumnoAsignaturaDTO();
                        asignatura = RellenaBean(dr);
                        lista.Add(asignatura);
                    }
                }
                return lista;
            }
            catch (Exception ex)
            {
                throw new DAOException(ex);
            }
        }

        #endregion
    }
}